(function($){
    /* @desc 设置弹窗
     * 在弹窗中添加div
     * 重新定位
	 * @author ming-yang@neusoft.com
	 */
    $.fn.popBox = function(options){
		var beforeInit = function () {
			var str = [];
			str.push('<!-- popBox -->');
			str.push('<div id="popBox" class="rel">');
			str.push('	<span id="haha_close" class="close abs">×</span>');
			str.push('	<header id="handle"><h4 id="handle_h4">提示框</h4></header>');
			str.push('	<section class="content rel" id="haha_content">');
			str.push('	</section>');
			str.push('</div><!-- /popBox -->');
			$('body').append(str.join(''));
		}; beforeInit();

        var defaults = {
            box : $('#popBox'),      // 需要被移动的容器
            dragBar : $('#handle'),  // 移动点击bar
            shadowColor : '#000000', // 遮罩的背景颜色
            speed : 200,             // 遮罩关闭的速度
            top : null               // 定位高度
        }

        var params = $.extend({}, defaults, options),
            w = $(window),
            $document = $(document),
            shadow = null,      // 遮罩对象
            popBox = params.box,// 弹出框对象
            dragBar = params.dragBar, // 拖拽条
            borderBox = null,   // 包边对象
            boxSize = [popBox.get(0).offsetWidth, popBox.get(0).offsetHeight], // 弹出窗长宽
			$top = params.top,
            wrappersize = null; // 窗口长宽

        // 初始化加载数据
        var init = function(){
			createShadow();
			createMoveBorder(); // 创建可移动边框
			shadow = $('.shadow');
			borderBox = $('#popBoxBorder');
			shadow.css('display', 'none');
			popBox.css({'display' : 'none', 'zIndex' : 2001});
			setPosition(); // 遮罩定位
			drag.move();
        }

		var setTitle = function (title) {
			$('#handle_h4').html(title);
		}

		var setContent = function (message) {
			$('#haha_content').html(message);
		};

        var currying = function(fn) {
            var args = [].slice.call(arguments, 1);
            return function() {
                var newArgs = args.concat([].slice.call(arguments));
                return fn.apply(null, newArgs);
            };
        }

        var show = currying(function() {
            var all = [].slice.call(arguments);
            // 设定最后一个参数为回调函数，获取最后一个函数
            var fn = all.slice(-1),
                args = all.slice(0, -1).join(','),
                callback = null; // 回调函数
            if(fn.length > 0) callback = fn[0];
            // 参数传递到回调函数中
            popBox.fadeIn(params.speed);  // 淡入弹出框
            shadow.fadeIn(params.speed);  // 淡入遮罩层
            setPosition();      // 遮罩定位
            return callback && callback(args);
        })

        // 关闭遮罩功能
        var hide = function(){
            popBox.fadeOut(params.speed); // 淡出弹出框
            shadow.fadeOut(params.speed); // 淡出遮罩层
        }

        // 添加遮罩
        var createShadow = function(){
            var div = ['<div class="shadow" style="'];
            div.push('position:absolute;');
            div.push('background-color : ' + params.shadowColor + ';');
            div.push('top : 0px;');
            div.push('left : 0px;');
            div.push('display : block;');
            div.push('z-index : 2000;');
            div.push('filter : alpha(opacity=30);');
            div.push('-moz-opacity : 0.3;');
            div.push('opacity : 0.3;');
            div.push('"></div>');
            $('body').append(div.join('')); // 将遮罩添加到body中
        }

        // 创建移动框
        var createMoveBorder = function(){
            var divStr = [];
            divStr.push('<div id="popBoxBorder" style="');
            divStr.push('width : ' + boxSize[0] + 'px;');
            divStr.push('height : ' + boxSize[1] + 'px;');
            divStr.push('position : absolute;');
            divStr.push('left : ' + 0 + 'px;');
            divStr.push('top : ' + 0 + 'px;');
            divStr.push('border : 1px solid #000000;');
            divStr.push('z-index : 2002;');
            divStr.push('display : none;');
            divStr.push('cursor : move;');
            divStr.push('"></div>');
            $('body').append(divStr.join('')); // 将移动框添加到body中
        }

        // 设置遮罩的位置
        var setPosition = function(){
            // 设置遮罩覆盖整个窗口
            shadow.css({'width' : Math.max(w.width(), window.document.documentElement.scrollWidth),
                        'height' : Math.max(w.height(), window.document.documentElement.scrollHeight)});
            // 设置弹出框居中显示
            popBox.css({'position' : 'absolute',
                        'left' : ((w.width() - popBox.width()) / 2 + w.scrollLeft()) + 'px',
                        'top' : $top || ((w.height() - popBox.height()) / 2 + w.scrollTop()) + 'px'});
            // 设置borderBox居中显示
            borderBox.css({'position' : 'absolute',
                        'left' : ((w.width() - popBox.width()) / 2 + w.scrollLeft()) + 'px',
                        'top' : $top || ((w.height() - popBox.height()) / 2 + w.scrollTop()) + 'px'});
            wrappersize = [shadow.width(), shadow.height()];
        }

        // 拖拽功能
        var drag = {
            pos : [], // 用于存放拖拽元素的坐标信息
            move : function(){
                dragBar.bind('mousedown', function(e){
                    // 存储弹出框的初始位置
                    boxSize = [popBox.get(0).offsetWidth, popBox.get(0).offsetHeight] // 弹出窗长宽
                    drag.pos = [parseInt(popBox.css('left')), parseInt(popBox.css('top'))];
                    borderBox.css('display', 'block');
                    // 存储需要移动到位置
                    var xyPos = [e.clientX, e.clientY];
                    // 绑定鼠标移动，并拖拽事件
                    $document.bind('mousemove.dragstart', function(e){
                        var pos = drag.pos,
                            bs = boxSize,               // 弹出窗长宽
                            ws = wrappersize;           // 窗口大小
                        var dx = e.clientX - xyPos[0],  // 水平移动距离
                            dy = e.clientY - xyPos[1];  // 垂直移动距离
                        // 清除选中文本，前面是IE特有的方法
                        (document.selection && document.selection.empty) ? document.selection.empty() : window.getSelection().removeAllRanges();
                        //.水平拖动距离和边界处理
                        var newX = (dx < 0) ? Math.max(0, pos[0] + dx) : Math.min(ws[0] - bs[0] - 2, pos[0] + dx),
                        // 垂直拖动距离和边界处理
                            newY = (dy < 0) ? Math.max(0, pos[1] + dy) : Math.min(ws[1] - bs[1] - 2, pos[1] + dy);
                        borderBox.css({width : boxSize[0] + 'px', height : boxSize[1] + 'px', left : typeof newX != 'undefined' ? newX : pos[0] + 'px', top : typeof newY != 'undefined' ? newY : pos[1] + 'px'});
                    });
                });
                $document.bind('mouseup', function(){
                    $document.unbind('mousemove.dragstart');
                    borderBox.css('display', 'none');
                    // 获取移动后的边框坐标
                    var p = [borderBox.css('left'), borderBox.css('top')];
                    // 根据坐标移动弹出框
                    popBox.css({left : p[0], top : p[1]});
                });
            }
        }

        var main = function(){
            init();
            // 重新设置窗口尺寸时触发
            w.bind('resize', function(){
                setPosition();
            });
            shadow.bind('click', function(){
                hide();
            });
			$('#haha_close').click(function () {
				hide();
			});
        }
        main();
        return {
            init : init,
            show : show,
            hide : hide,
			setContent : setContent,
            setPosition : setPosition
        }
    }
})(jQuery)
